// ============================== 导出混合 ============================== //

export default {
  /**
   * 模型绑定 (使用 v-model="xxx")
   */
  model: {
    prop: 'detailVisible', // 与 props 里的名称一致
    event: 'detailClose', // 回传调用的事件名称
  },

  /**
   * 属性注册 (抽取以便查阅)
   */
  props: {
    id: { type: [String, Number], default: '' },
    obj: { type: Object, default: () => null },
    detailVisible: { type: Boolean, required: true },
  },

  /**
   * 计算属性 (慎用箭头函数)
   */
  computed: {
    /**
     * 显示弹窗 (双向绑定)
     */
    model: {
      get() {
        const { MAP, one, detailVisible } = this
        const key = MAP.REQUIRED_KEY || 'id'
        return !!one[key] && detailVisible
      },
      set() {
        this.$emit('detailClose', false) // 关闭详情

        setTimeout(() => {
          this.$emit('close', false) // 触发关闭事件
          this.one.id = '' // 清空 ID
          this.setParam() // 清空列表参数 (如有)
          this.afterClose() // 关闭之后
        }, 300)
      },
    },
  },

  /**
   * 监听属性 (深度 deep 首次 immediate)
   */
  watch: {
    /**
     * 监听单项失败
     */
    needOne(need) {
      if (!need && !this.readyOne) this.model = false
    },

    /**
     * 监听删除就绪
     */
    readyDel(ready) {
      if (ready) {
        if (this.INIT_CONFIG.DEL_KEEP_ID) this.$emit('change') // 触发更新事件
        else this.model = false
      }
    },

    /**
     * 监听提交就绪
     */
    readySubmit(ready) {
      ready && this.$emit('change') // 触发更新事件
    },

    /**
     * 监听修改就绪
     */
    readyEdit(ready) {
      ready && this.$emit('change') // 触发更新事件
    },

    /**
     * 监听通过就绪
     */
    readyPass(ready) {
      ready && this.$emit('change') // 触发更新事件
    },

    /**
     * 监听拒绝就绪
     */
    readyRej(ready) {
      ready && this.$emit('change') // 触发更新事件
    },

    /**
     * 监听处理的修改就绪
     */
    deal_readyEdit(ready) {
      ready && this.toChange()
    },
  },

  /**
   * 本地方法 (轻量重要在前)
   */
  methods: {
    /**
     * 改变事件
     */
    toChange() {
      this.startOne() // 刷新详情
      this.$emit('change') // 触发更新事件
    },

    /**
     * 关闭之后 (可覆盖)
     */
    afterClose() {
      //
    },
  },
}
